package services.impl;

import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import services.RodamientoService;
import dao.RodamientoDAO;
import entities.Rodamiento;
import entities.RodamientoStock;
import entities.VO.RodamientoStockVO;
import finals.Finals;

@Stateless
public class RodamientoServiceBean implements RodamientoService{

	private Logger logger = Logger.getLogger(Finals.LOGPATH);
	@EJB
	private RodamientoDAO rodamientoDAO;
	
	@Override
	public int disminuirStock(Integer cantidad, RodamientoStock rodamiento) {
		int stockFaltante = cantidad - rodamiento.getStock();
		if(stockFaltante > 0){
			rodamiento.setStock(0);
		}else{
			rodamiento.setStock(rodamiento.getStock()-cantidad);//Le sdescuento el stock facturado
		}
		rodamientoDAO.merge(rodamiento);
		return stockFaltante;
	}
	
	@Override
	public Integer obtenerStock(Rodamiento rodamiento) {
		Integer stock = rodamientoDAO.obtenerStock(rodamiento);
		if(stock == null){
			return 0;
		}else{
			return stock;
		}
	}
	

	@Override
	public Boolean existeRodamiento(Rodamiento rodamiento) {
		Rodamiento rodamientoObtenido = this.find(rodamiento);
		if(rodamientoObtenido == null){
			return false;
		}else{
			return true;
		}
	}

	@Override
	public void actualizarRodamiento(RodamientoStockVO rodamientoStockVO) {
		RodamientoStock rodamiento = new RodamientoStock();
		rodamiento.setVO(rodamientoStockVO);
		
		RodamientoStock rodamientoBase = (RodamientoStock) this.findByID(rodamientoStockVO.getId());
		if(rodamientoBase.getStock() < rodamiento.getStock()){
			rodamiento.setHasStockNuevo(true);
		}
		this.merge(rodamiento);
	}
	
	@Override
	public void altaRodamiento(RodamientoStockVO rodamientoStockVO) {
		try{
			RodamientoStock rodamiento = new RodamientoStock();
			rodamiento.setVO(rodamientoStockVO);
			persist(rodamiento);
		}catch(Exception e){
			logger.log(Level.SEVERE, e.getMessage());
		}	
	}
	
	@Override
	public Rodamiento find(Rodamiento rodamiento) {
		return rodamientoDAO.find(rodamiento);
	}
	
	@Override
	public RodamientoStock findRodamientoStock(Rodamiento rodamiento) {
		return rodamientoDAO.findRodamientoStock(rodamiento);
	}
	
	@Override
	public void delete(Object id) {
		rodamientoDAO.delete(id);
	}

	@Override
	public List<Rodamiento> findAll() {
		return rodamientoDAO.findAll();
	}
	
	/**
	 * Obtiene todos los proveedores en formato VO
	 */
	public List<RodamientoStockVO> findAllVO() {
		List<RodamientoStockVO> rodamientosVO = new Vector<RodamientoStockVO>();
		for (RodamientoStock rodamiento : rodamientoDAO.findAllRodamientoStock()) {
			rodamientosVO.add(rodamiento.getVO());			
		}
		return rodamientosVO;
	}
	
	@Override
	public List<RodamientoStock> findRodamientosConStockNuevo() {
		return this.rodamientoDAO.findRodamientosConStockNuevo();
	}

	@Override
	public Rodamiento findByID(Object id) {
		return rodamientoDAO.findByID(id);
	}
	
	@Override
	public RodamientoStockVO findVOByID(Object id) {
		RodamientoStock rod = (RodamientoStock) rodamientoDAO.findByID(id);
		return rod.getVO();
	}

	@Override
	public void persist(Rodamiento entity) {
		rodamientoDAO.persist(entity);
	}

	@Override
	public Rodamiento merge(Rodamiento entity) {
		return rodamientoDAO.merge(entity);
	}

}
